package si.yun.utils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.*;

/**
 * @ClassName: 工具类
 * @Description: TODO
 * @Author: 李振海
 * @Date 2021/8/2 21:22
 */
public class Utils {


    //计算两个时间的差值
    public static String getDatePoor(Date endDate, Date nowDate) {
        long nd = 1000 * 24 * 60 * 60;
        long nh = 1000 * 60 * 60;
        long nm = 1000 * 60;
        // long ns = 1000;
        // 获得两个时间的毫秒时间差异
        long diff = endDate.getTime() - nowDate.getTime();
        // 计算差多少天
        long day = diff / nd;
        // 计算差多少小时
        long hour = diff % nd / nh;
        // 计算差多少分钟
        long min = diff % nd % nh / nm;
        // 计算差多少秒//输出结果
        // long sec = diff % nd % nh % nm / ns;
        return day + "天" + hour + "小时" + min + "分钟";

    }

    /**
     * 判断当前时间是否在某个时间之前
     *
     * @param tagDateTime 判断的标准
     * @return true是，false不是
     */
    public static boolean belongCalendarBefore(String tagDateTime) {
        try {
            DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd yyyy-MM-dd HH:mm:ss");
            Calendar contCalendar = Calendar.getInstance();
            Calendar tagCalendar = (Calendar) contCalendar.clone();
            tagCalendar.setTime(dateFormat.parse(tagDateTime));

            return contCalendar.before(tagCalendar);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * @Author : 李振海
     * @Date : 2021/9/6 21:28
     * @Param : []
     * @Return : java.util.List<java.lang.String>
     *     获取本周每日日期
     */
    public static List<String> getWeek(){

        //获取日历实例，默认日期时间为当前，可根据具体的业务场景修改日期时间
        Calendar calendar = Calendar.getInstance();

        //设置日期为2020-04-08(武汉解封的日子)
        calendar.set(Calendar.YEAR,calendar.get(Calendar.YEAR));
        calendar.set(Calendar.MONTH,calendar.get(Calendar.MONTH));
        calendar.set(Calendar.DAY_OF_MONTH,calendar.get(Calendar.DATE));

        /**
         * 设置日历日期为本周的周一
         * 循环取当前的星期和周一做比对，如果不是周一，设置日历往过去推一天，直到设置周一成功
         */
        while (calendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
            calendar.add(Calendar.DAY_OF_MONTH,-1);
        }

        //当前周日期数组
        String[] currentWeekDays = new String[8];

        //日期格式化
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        currentWeekDays[0] = df.format(calendar.getTime());

        for (int i = 1; i < currentWeekDays.length; i++) {
            calendar.add(Calendar.DAY_OF_MONTH,1);
            currentWeekDays[i] = df.format(calendar.getTime());
        }

        //返回当前周所有日期
        return  Arrays.asList(currentWeekDays);
    }


    /**
     * 获取当日期前/后某个月的所有日期  0表示当前月   负数表示前多少月  正数表示后多少月
     * @param month
     * @return
     */
    public static List<String> getDayListOfMonth(Integer months){
        //获取日历实例，默认日期时间为当前，可根据具体的业务场景修改日期时间
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        List<String> list = new ArrayList<>();
        Calendar aCalendar = Calendar.getInstance(Locale.CHINA);
        aCalendar.set(aCalendar.MONTH, months+1);
        int year = calendar.get(Calendar.YEAR);//年份
        int month =calendar.get(Calendar.MONTH)+1;//月份

        int day = LocalDate.now().withMonth(month).lengthOfMonth();
        for (int i = 1; i <= day; i++) {
            String aDate = String.valueOf(year)+"-"+month+"-"+i;
            Date parse = null;
            try {
                parse = simpleDateFormat.parse(aDate);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            SimpleDateFormat dateSdf = new SimpleDateFormat("yyyy-MM-dd");
            String nowDate = dateSdf.format(parse);
            list.add(nowDate);
        }
        return list;

    }

    /**
     * @Author : 李振海
     * @Date : 2021/9/6 21:29
     * @Param : []
     * @Return : java.util.List<java.lang.String>
     *     获取本月每日日期
     */
    // 获取日期列表
    public static List<Integer> getMonth() throws ParseException {
        //获取日历实例，默认日期时间为当前，可根据具体的业务场景修改日期时间
        Calendar calendar = Calendar.getInstance();
        int month =calendar.get(Calendar.MONTH)+1;//月份
        int day = LocalDate.now().withMonth(month).lengthOfMonth();

        List<Integer> list=new ArrayList<>();
        for(int i=1;i<=day;i++){
            list.add(i);
        }
        return list;

    }


    /**
     * @Author : 李振海
     * @Date : 2021/9/6 21:40
     * @Param : []
     * @Return : java.util.List<java.lang.String>
     *    获取本日每小时时间
     */
    public static List<String> getDay(int i) throws ParseException {
        /*获取当天日期*/
        Date date = new Date();
        /*设置日期格式*/
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        /*将日期转为字符串*/
        String today = df.format(date);

        /*将字符串转为Date类型*/
        // SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        /*从当前日期的00:00开始*/
        Date parse = simpleDateFormat.parse(today + " 00:00");

        /*输出开始日期时间*/
        String format = simpleDateFormat.format(parse);
        List<String> dateList = new LinkedList<String>();

        /*循环47次(24*2-1获得每半个小时的时间    第一天00:00到第二天00:00)*/
        for (int y = 0; y < 9; y++) {

            /*将指定时间依次加30分钟,循环到23:30为止(以此类推,如果是获取按小时划分, +60分钟)*/
            Calendar c = Calendar.getInstance();
            /*设置指定时间*/
            c.setTime(parse);
            /*将设置的时间加上60分钟*/
            c.add(Calendar.MINUTE, 60*3);
            /*获得加上30分钟后的时间*/
            Date dateTime = c.getTime();
            /*将新时间赋值后再循环*/
            parse = dateTime;

            /*将date转为字符串*/
            SimpleDateFormat sdf;
            if(i==0){
                 sdf = new SimpleDateFormat("HH:mm");
            }else{
                 sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
            }

            String format2 = sdf.format(dateTime);

            dateList.add(format2);
        }
        return dateList;
    }


    /**
     *
     * 描述:获取下一个月的第一天.
     *
     * @return
     */
    public static String getPerFirstDayOfMonth() {
        SimpleDateFormat dft = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MONTH, 1);
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
        return dft.format(calendar.getTime());
    }


    //将日期字符串剪切成时间    2019-10-10 23:59:59
    public static String getOnlyTime(String dateString){
        String substring = dateString.substring(11);
        return substring;
    }

    //传入时间格式为 08:20:20
    public static Date getTime(String dateString)throws ParseException {
        SimpleDateFormat dfEndTime = new SimpleDateFormat("HH:mm:ss");
        Date parse = dfEndTime.parse(dateString);
        return parse;
    }

    //将日期字符串装换 时分秒时间
    public static Date getHourAndSecondsTime(String dateString) throws ParseException {
        SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
        Date date = df.parse(dateString.substring(11));
        return date;
    }

    //将日期字符串装换 日期时间类型
    public static Date getStringToDateAndTime(String dateString) throws ParseException {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = df.parse(dateString);
        return date;
    }

    //将日期装换 日期时间字符串
    public static String getDateToTimeString(Date date) throws ParseException {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = df.format(date);
        return format;
    }

    //将日期字符串装换  年月日 日期类型
    public static Date getDateSpecificDate(String dateString) throws ParseException {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date date = df.parse(dateString);
        return date;
    }

    //将日期字符串装换  年月日 日期类型
    public static String getDayString(String dateString) throws ParseException {
        String stringDay = dateString.substring(0,10);
        return stringDay;
    }

    //获取每天最晚时间
    public static Date getLastTime()throws ParseException {
        SimpleDateFormat dfEndTime = new SimpleDateFormat("HH:mm:ss");
        Date parse = dfEndTime.parse("23:59:59");
        return parse;
    }

    //获取指定时间的后一天
    public static String getLastOneDay(String dateString) throws ParseException {
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
        Date parse = sf.parse(dateString);
        Calendar c = Calendar.getInstance();
        c.setTime(parse);
        c.add(Calendar.DAY_OF_MONTH, 1);
        return sf.format(c.getTime());
    }

    /**
     * 获取过去第7天的日期     (- 操作) 或者 未来 第几天的日期( + 操作)
     */
    public static String getCurrentSevenDay() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - 7);
        Date today = calendar.getTime();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String result = format.format(today);
        return result;
    }
    //获取过去多少天的日期
    public static String getCurrentDay(int day) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - day);
        Date today = calendar.getTime();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String result = format.format(today);
        return result;
    }



}
